import myLoginVue from "../components/my-login/my-login.vue"

export default {
  // 为当前模块开启命名空间
  namespaced: true,

  // 模块的 state 数据
  state: () => ({
    address: JSON.parse(uni.getStorageSync('address') || '{}'),
    token: uni.getStorageSync('token') || '',
    // 用户的信息
    userInfo: JSON.parse(uni.getStorageSync('userInfo') || '{}'),
    // 重定向的对象
    redirectInfo: null,
    // 用户搜索记录
    historyList: JSON.parse(uni.getStorageSync('kw') || '[]'),
    // 已注册用户的id和username，用于注册前自定义表单验证，查找用户名和账号是否重复
    // registeredUser: []
    // 用户收藏商品
    collection: JSON.parse(uni.getStorageSync('collection') || '[]'),
    // 用户全部订单
    order: JSON.parse(uni.getStorageSync('order') || '[]'),
  }),

  // 模块的 mutations 方法
  mutations: {
    // 更新收货地址
    updateAddress(state, address) {
      state.address = address
      this.commit('m_user/saveAddressToStorage')
    },
    // 持久化存储收货地址
    async saveAddressToStorage(state) {
      uni.setStorageSync('address', JSON.stringify(state.address))
      // 此处用户已登录，更新数据库中用户收货地址
      const { data: res } = await uni.$http.post('/api/public/v1/users/updateaddress', {
        token: state.token,
        address: state.address
      })
      if (res.meta.status !== 200) return uni.$showMsg('更新收货地址失败！')
    },
    // 清空用户收货地址（退出登录时调用）
    clearAddress(state) {
      state.address = {}
      uni.setStorageSync('address', '{}')
    },
    // 更新userInfo
    updateUserInfo(state, userInfo) {
      state.userInfo = userInfo
      this.commit('m_user/saveuserInfoToStorage')
    },
    // 持久化存储用户信息
    saveuserInfoToStorage(state) {
      uni.setStorageSync('userInfo', JSON.stringify(state.userInfo))
    },
    // 更新token
    updateToken(state, token) {
      state.token = token
      this.commit('m_user/saveTokenToStorage')
    },
    // 持久化存储token
    saveTokenToStorage(state) {
      uni.setStorageSync('token', state.token)
    },
    // 存储有重定向页面的信息的对象
    updateRedirectInfo(state, info) {
      state.redirectInfo = info
    },
    // async getRegisteredUser(state) {
    //   const { data: res } = await uni.$http.get('/api/public/v1/users/checkregister')
    //   if (res.meta.status !== 200) return console.log('获取已注册用户数据失败！')
    //   state.registeredUser = res.message
    // }
    // 保存搜索关键词
    saveSearchHistory(state, kw) {
      // 使用 Set 进行数组去重，并把新的搜索关键词放在数组末尾，以便在计算属性中进行数组反转后，将新的关键词放在第一位
      const set = new Set(state.historyList)
      set.delete(kw) //有重复的 kw 则删除，没有则此句返回 false
      set.add(kw)
      state.historyList = Array.from(set) // Array.from(): 将 set 对象转化为数组
      // 将搜索历史记录持久化存储到本地
      uni.setStorageSync('kw', JSON.stringify(state.historyList))
      // 若用户已登录，更新数据库中用户的搜索历史
      this.commit('m_user/updateSearchHistory')
    },
    // 保存用户搜索关键字数据（数组）到本地（用户登录后调用）
    saveUserSearchHistory(state, historyList) {
      state.historyList = JSON.parse(historyList)
      uni.setStorageSync('kw', historyList)
    },
    // 清空搜索历史记录
    clearHistory(state) {
      // 清空 state 中保存的搜索历史记录
      state.historyList = []
      // 清空本地存储中记录的搜索历史
      uni.setStorageSync('kw', '[]')
      // 若用户已登录，清空数据库中用户的搜索历史
      this.commit('m_user/updateSearchHistory')
    },
    // 若用户已登录，更新或清空数据库中用户的搜索历史
    async updateSearchHistory(state) {
      // 若用户已登录，则根据token更新或清空数据库中该用户的搜索历史
      if (state.token) {
        // 下边请求中传的值 state.historyList 为数组类型
        const { data: res } = await uni.$http.post('/api/public/v1/users/updatesearchhistory', {
          token: state.token,
          historyList: state.historyList
        })
        if (res.meta.status !== 200) return uni.$showMsg('清除搜索数据失败！')
      }
    },
    // 保存用户收藏商品数据（数组）到本地（用户登录后调用）
    saveUserCollection(state, collection) {
      state.collection = JSON.parse(collection)
      uni.setStorageSync('collection', collection)
    },
    // 清除收藏夹数据（退出登录后调用）
    clearCollection(state) {
      state.collection = []
      uni.setStorageSync('collection', '[]')
    },
    // 添加新的收藏商品
    addToCollection(state, goods_info) {
      // 整理数据，收藏商品只需要 goods_info 中的部分数据
      const collect_goods_info = {
        goods_id: goods_info.goods_id,
        goods_name: goods_info.goods_name,
        goods_price: goods_info.goods_price,
        goods_small_logo: goods_info.goods_small_logo
      }
      const findResult = state.collection.find(item => item.goods_id === collect_goods_info.goods_id)
      if (!findResult) {
        // 收藏夹中没有此商品，则添加该商品到收藏夹中
        state.collection.push(collect_goods_info)
      }
      this.commit('m_user/updateCollection')
    },
    // 更新用户收藏商品数据
    async updateCollection(state) {
      uni.setStorageSync('collection', JSON.stringify(state.collection))
      // 此处用户已登录
      const { data: res } = await uni.$http.post(
        '/api/public/v1/users/updatecollection', { token: state.token, collection: state.collection })
      if (res.meta.status !== 200) return uni.$showMsg('更新用户收藏商品数据失败！')
    },
    // 取消收藏
    delCollection(state, goods_id) {
      state.collection = state.collection.filter(item => item.goods_id !== goods_id)
      this.commit('m_user/updateCollection')
    },
    // 保存用户订单信息（登录后 或 更新订单数据后，再次获取新的订单数据时调用）
    saveUserOrder(state, order) {
      state.order = order
      uni.setStorageSync('order', JSON.stringify(order))
    },
    // 清除用户订单数据（退出登录后调用）
    clearOrder(state) {
      state.order = []
      uni.setStorageSync('order', '[]')
    },
    // 更新订单数据
    updateOrder(state, newOrder) {
      // 向订单数组插入新订单（头插）
      state.order.unshift(newOrder)
      uni.setStorageSync('order', JSON.stringify(state.order))
    },
    // 获取订单数据（修改订单信息后（支付、取消订单、申请退货）调用该方法，获取更新后的订单信息保存到本地）
    async getOrderInfo(state) {
      const { data: res } = await uni.$http.get('/api/public/v1/users/getorders', state.userInfo)
      if (res.meta.status !== 200) return uni.$showMsg('获取订单失败！')
      // 获取订单数据成功，保存用户订单信息
      this.commit('m_user/saveUserOrder', res.message.order)
    },
    // 修改用户头像
    async updateAvatar(state, newAvatar) {
      state.userInfo.avatar = newAvatar
      this.commit('m_user/saveuserInfoToStorage')
      const { data: res } = await uni.$http.post('/api/public/v1/users/updateavatar', {
        token: state.token,
        newAvatar
      })
      if (res.meta.status !== 200) return uni.$showMsg('修改头像失败！')
      uni.showToast({
        icon: "success",
        title: '修改头像成功'
      })
    }
  },

  // 模块的 getters 属性
  getters: {
    // 拼接收货地址
    addressStr(state) {
      if (!state.address.cityName) return ''
      // 拼接 省，市，区，详细地址 的字符串并返回给用户
      return state.address.provinceName + state.address.cityName + state.address.countyName + state.address.detailInfo
    },
    // 用户待付款订单
    orderWaitPay(state) {
      return state.order.filter(item => !item.is_close && !item.is_pay)
    },
    // 用户待发货订单
    orderWaitDeliver(state) {
      return state.order.filter(item => item.is_pay && !item.is_deliver)
    },
    // 用户待收货订单
    orderWaitReceive(state) {
      return state.order.filter(item => item.is_pay && item.is_deliver && !item.is_receive)
    },
    // 用户已收货（交易完成）的订单
    orderComplete(state) {
      return state.order.filter(item => !item.is_close && !item.is_return && item.is_receive)
    },
    // 用户退款/售后订单
    orderReturn(state) {
      return state.order.filter(item => item.is_close || (!item.is_close && item.is_return))
    }
  },
}
